package com.xadrez.controlador;

import com.xadrez.Principal;
import com.xadrez.ia.IA;
import com.xadrez.modelo.Jogador;
import com.xadrez.view.MapeadorDePosicao;
import com.xadrez.view.MovimentoView;
import com.xadrez.view.PecaView;
import com.xadrez.view.TabuleiroView;
import java.awt.event.MouseEvent;

public class MovimentoControlador {
    private static boolean fezMovimento = false;
    //Teremos uma variavel para armazenar a peca que queremos mover.
    private static PecaView pecaAMover = null;
    
    // Esse método alterna entre a vez do jogador e a vez da IA
    public static void rodaAPartida(Jogador jogadorUm, Jogador jogadorDois) {
        int vitoriasJ1 = jogadorUm.getNumeroDeVitorias();
        int vitoriasJ2 = jogadorDois.getNumeroDeVitorias();

        Principal.setJogadorDaVez(jogadorUm);

        while (vitoriasJ1 == jogadorUm.getNumeroDeVitorias() 
                && vitoriasJ2 == jogadorDois.getNumeroDeVitorias()) {
            if (Principal.getJogadorDaVez() instanceof IA) {
                IA jogador = (IA) Principal.getJogadorDaVez();
                realizaMovimentoDaIA(jogador);
                Principal.setJogadorDaVez(Principal.getJogadorAdversario());
            } else {                
                // Da tela surgirá o movimento humano, pois está dependente do clique. Então, ATENCAO! Está com warning mas não esta errado.
                while (!fezMovimento);
                fezMovimento = false;
                Principal.setJogadorDaVez(Principal.getJogadorAdversario());
            }
        }
    }

    public static void realizaMovimentoHumano(MouseEvent e) {
        //1. Recuperamos a peca a qual o jogador supostamente clicou.
        PecaView pecaView = TabuleiroView.getInstance().buscaPeca(e.getX(), e.getY());

        if (pecaView != null && !(pecaView.getPeca().getJogador() instanceof IA)) {
            //2. O jogador clicou numa peça dele
            //3. Se nao existia nenhuma peca a mover armazenada na varial, adicionamos essa, se essa for uma peca do jogador.
            pecaAMover = pecaView;

            //Desenharemos a ação da peca no tabuleiro(view)
            MovimentoView.desenhaAcaoDoMouse(e);

            //Som.getInstance().tocouEmPeca(); <-- REVER METODO! ESTA LERDO! POR ISSO ESTA COMENTADO!!!
        } else {
            //2. Se chegou aqui quer dizer que ele clicou num espaço vazio ou numa peça inimiga
            if (pecaAMover != null) {
                //3. Se pecaAMover diferente de null, significa que tem uma peca esperando para ser movida...

                //4. 'MapeadorDePosicao' é a classe que faz a relação entre uma posicao do tabuleiro(modelo) e uma posicao do tabuleiro(view).
                //Vamos usar um método para descobrir a que posicao do tabuleiro(modelo) equivale a posicao apontada pelo mouse no tabuleiro(view).
                MapeadorDePosicao mP = TabuleiroView.getInstance().recuperaMapaDePosicao(e.getX(), e.getY());

                //5. Tentaremos movimentar a peca para a posicao recuperada do mapeador.
                if (Principal.getJogadorDaVez().jogar(pecaAMover.getPeca(), mP.getPosicaoReal())) {
                    //6. Caso tenhamos conseguido movimentar a peca, agora a variavel pecaAMover, volta a ser null
                    pecaAMover = null;
                    fezMovimento = true;
                    //Som.getInstance().colocouPeca(); <-- REVER METODO! ESTA LERDO! POR ISSO ESTA COMENTADO!!!
                }

                //Desenharemos a ação da peca no tabuleiro(view)
                MovimentoView.desenhaAcaoDoMouse(e);
            }
        }
    }

    public static void realizaMovimentoDaIA(IA jogador) {
//        jogador.jogar();
//        Para fazer o movimento da ia na view, vc vai ter que usar um dos dois
//        métodos que irei implementar: MovimentoView.desenhaIAComendo(pecaComedora, pecaASerComida) ou 
//        MovimentoView.desenhaIAMovendo(pecaASerMovida,Jogada);
    }
}
